package checkers;

/*
 * %W% %E%
 * 
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * -Redistribution of source code must retain the above copyright notice, this
 *  list of conditions and the following disclaimer.
 * 
 * -Redistribution in binary form must reproduce the above copyright notice, 
 *  this list of conditions and the following disclaimer in the documentation
 *  and/or other materials provided with the distribution.
 * 
 * Neither the name of Oracle or the names of contributors may 
 * be used to endorse or promote products derived from this software without 
 * specific prior written permission.
 * 
 * This software is provided "AS IS," without a warranty of any kind. ALL 
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN")
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
 * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
 * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST 
 * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, 
 * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY 
 * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, 
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 * 
 * You acknowledge that this software is not designed, licensed or intended
 * for use in the design, construction, operation or maintenance of any
 * nuclear facility.
 */

/*
 * %W% %E%
 */

import java.awt.*;
import java.applet.*;

/**
 * Displays a timer that can be reset/started and stopped
 * 
 * Time! modified Java Applet that comes with jdk 1.6 for use in the checkers
 * project. Full disclamer can be found inside of Clock.java file
 * 
 * Modified by Daniel Peek replaced circle drawing calculation, few more
 * changes.
 * <p>
 * 
 * @author Rachel Gollub
 * 
 */
public class Clock extends Applet implements Runnable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 8345591987136959395L;
	private volatile Thread timer; // The thread that displays clock
	private int lastxs, lastys, lastxm, lastym, lastxh, lastyh; // Dimensions
																// used to draw
																// hands
	private String lastTime; // String to hold date displayed
	private Font clockFaceFont; // Font for number display on clock
	private Color handColor; // Color of main hands and dial
	private Color numberColor; // Color of second hand and numbers
	private int xcenter = 80, ycenter = 55; // Center position
	private int hours;
	private int minutes;
	private int seconds;
	private long initialTime;
	private long currentTime;
	private long diff;
	private long stopTime;
	private String name;

	/**
	 * Creates a Clock Object.
	 * 
	 * @param name
	 *            The name of the clock.
	 */
	public Clock(String name) {
		this.name = name;
		diff = 0;
		hours = 0;
		minutes = 0;
		seconds = 0;
		initialTime = System.currentTimeMillis();
		currentTime = initialTime;
		stopTime = initialTime;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.applet.Applet#init()
	 */
	public void init() {
		lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;
		long totalSeconds;
		totalSeconds = (currentTime - initialTime - diff) / 1000;

		// System.out.println(lastTime);
		seconds = (int) totalSeconds;
		minutes = (int) totalSeconds / 60;
		hours = (int) minutes / 60;
		seconds = seconds % 60;
		minutes = minutes % 60;
		lastTime = "     " + name + " Turn: " + hours + ":" + minutes + ":"
				+ seconds;

		clockFaceFont = new Font("Serif", Font.PLAIN, 14);
		handColor = Color.white;
		numberColor = Color.white;
		setBackground(Color.black);
		resize(160, 130); // Set clock window size

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.awt.Container#update(java.awt.Graphics)
	 * 
	 * Paint is the main part of the program
	 */
	public void update(Graphics g) {
		int xh, yh, xm, ym, xs, ys;
		int s = 0, m = 10, h = 10;
		String newTime;
		long totalSeconds;

		currentTime = System.currentTimeMillis();
		totalSeconds = (currentTime - initialTime - diff) / 1000;
		seconds = (int) totalSeconds;
		minutes = (int) totalSeconds / 60;
		hours = (int) minutes / 60;
		seconds = seconds % 60;
		minutes = minutes % 60;
		newTime = "     " + name + " Turn: " + hours + ":" + minutes + ":"
				+ seconds;

		s = seconds;
		m = minutes;
		h = hours;

		// Set position of the ends of the hands
		xs = (int) (Math.cos(s * Math.PI / 30 - Math.PI / 2) * 45 + xcenter);
		ys = (int) (Math.sin(s * Math.PI / 30 - Math.PI / 2) * 45 + ycenter);
		xm = (int) (Math.cos(m * Math.PI / 30 - Math.PI / 2) * 40 + xcenter);
		ym = (int) (Math.sin(m * Math.PI / 30 - Math.PI / 2) * 40 + ycenter);
		xh = (int) (Math.cos((h * 30 + m / 2) * Math.PI / 180 - Math.PI / 2) * 30 + xcenter);
		yh = (int) (Math.sin((h * 30 + m / 2) * Math.PI / 180 - Math.PI / 2) * 30 + ycenter);

		newTime = "     " + name + " Turn: " + hours + ":" + minutes + ":"
				+ seconds;

		g.setFont(clockFaceFont);
		// Draw the circle and numbers
		g.setColor(handColor);
		g.drawArc(xcenter - 50, ycenter - 50, 100, 100, 0, 360);
		g.setColor(numberColor);
		g.drawString(".", xcenter - 45, ycenter + 3);
		g.drawString(".", xcenter + 40, ycenter + 3);
		g.drawString(".", xcenter - 5, ycenter - 37);
		g.drawString(".", xcenter - 3, ycenter + 45);

		g.setFont(clockFaceFont);
		// Erase if necessary
		g.setColor(getBackground());
		if (xs != lastxs || ys != lastys) {
			g.drawLine(xcenter, ycenter, lastxs, lastys);
			g.drawString(lastTime, 5, 125);
		}
		if (xm != lastxm || ym != lastym) {
			g.drawLine(xcenter, ycenter - 1, lastxm, lastym);
			g.drawLine(xcenter - 1, ycenter, lastxm, lastym);
		}
		if (xh != lastxh || yh != lastyh) {
			g.drawLine(xcenter, ycenter - 1, lastxh, lastyh);
			g.drawLine(xcenter - 1, ycenter, lastxh, lastyh);
		}

		// Draw date and hands
		g.setColor(numberColor);
		g.drawString(newTime, 5, 125);
		g.drawLine(xcenter, ycenter, xs, ys);
		g.setColor(handColor);
		g.drawLine(xcenter, ycenter - 1, xm, ym);
		g.drawLine(xcenter - 1, ycenter, xm, ym);
		g.drawLine(xcenter, ycenter - 1, xh, yh);
		g.drawLine(xcenter - 1, ycenter, xh, yh);
		lastxs = xs;
		lastys = ys;
		lastxm = xm;
		lastym = ym;
		lastxh = xh;
		lastyh = yh;
		lastTime = newTime;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.awt.Container#paint(java.awt.Graphics)
	 */
	public void paint(Graphics g) {
		g.setFont(clockFaceFont);
		// Draw the circle and numbers
		g.setColor(handColor);
		g.drawArc(xcenter - 50, ycenter - 50, 100, 100, 0, 360);
		g.setColor(numberColor);
		g.drawString(".", xcenter - 45, ycenter + 3);
		g.drawString(".", xcenter + 40, ycenter + 3);
		g.drawString(".", xcenter - 5, ycenter - 37);
		g.drawString(".", xcenter - 3, ycenter + 45);

		// Draw date and hands
		g.setColor(numberColor);
		// g.drawString(lastTime, 5, 125);
		g.drawLine(xcenter, ycenter, lastxs, lastys);
		g.setColor(handColor);
		g.drawLine(xcenter, ycenter - 1, lastxm, lastym);
		g.drawLine(xcenter - 1, ycenter, lastxm, lastym);
		g.drawLine(xcenter, ycenter - 1, lastxh, lastyh);
		g.drawLine(xcenter - 1, ycenter, lastxh, lastyh);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.applet.Applet#start()
	 */
	public void start() {
		if (timer == null) {
			timer = new Thread(this);
			this.reset();
			timer.start();
			currentTime = System.currentTimeMillis();
			diff += currentTime - stopTime;
			System.out.println("difference: " + diff);
		}

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.applet.Applet#stop()
	 */
	public void stop() {
		if (timer != null) {
			timer = null;
			stopTime = System.currentTimeMillis();
		}
	}

	/**
	 * Resets the clock.
	 */
	public void reset() {
		diff = 0;
		hours = 0;
		minutes = 0;
		seconds = 0;
		initialTime = System.currentTimeMillis();
		currentTime = initialTime;
		stopTime = initialTime;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Runnable#run()
	 */
	public void run() {
		Thread me = Thread.currentThread();
		while (timer == me) {
			try {
				Thread.currentThread();
				Thread.sleep(100);
			} catch (InterruptedException e) {
			}
			repaint();
		}
	}
}
